<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>2.声明定义Symbol的几种方式</title>
</head>

<body>
  <script>
    // 直接定义
    let hd = Symbol();
    let edu = Symbol();
    console.log(typeof hd);// symbol
    console.log(hd); //Symbol()
    // symbol是唯一的
    console.log(hd == edu); //false

    // symbol 不可以定义属性,不要把它当作普通对象，此时的Symbol可以当成永远不会重复的字符串
    hd.name = '后盾人';
    console.log(hd.name); //undefined

    // symbol添加描述
    hd = Symbol('后盾人在线教程');
    edu = Symbol('网址是houdunren.com');
    console.log(hd.toString()); // 打印描述 Symbol(后盾人在线教程)
    // 使用系统属性获得描述
    console.log(hd.description); // 提取描述： 后盾人在线教程


    // Symbol for定义 symbol，使用这种方法，系统会根据描述在内存中进行记录
    // 第二脆用symbol for，并相同描述定义的时候，系统会查之前有没有使用这个描述声明过symbol，
    // 如果有则会把这个记录过的 symbol 拿过来
    // 因此 symbol for 适合于反复使用的情况
    // 整个过程类似单例
    let cms = Symbol.for("hdcms");// symbol for 定义Symbol和描述
    edu = Symbol.for("hdcms");
    console.log(edu == cms); // true 若不使用 symbol for 声明，会生成两个symbol，比较结果为false
    
    //Symbol.keyFor, 查使用Symbol.for 声明的symbol的描述，如果找不到返回undefined 。
    console.log(Symbol.keyFor(hd)); //  undefined 普通声明，拿不到描述
    console.log(Symbol.keyFor(edu)); // hdcms  Symbol.for 声明，返回描述
     

  </script>
</body>

</html>